/*
 * 文件名：XMLUtil.java
 * 版权：Copyright by http://www.znjf.com/
 * 描述：
 * 修改人：Awoke
 * 修改时间：2018年5月9日
 * 跟踪单号：
 * 修改单号：
 * 修改内容：
 */

package top.infopub.util;


import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * XMLUtil
 * @author Awoke
 * @version 2018年5月9日
 * @see XMLUtil
 * @since
 */
public final class XMLUtil<T> {

    private Logger log = LoggerFactory.getLogger(XMLUtil.class);

    /**
     * 解析xml文件返回保存clazz的List集合
     * 
     * @param xml xml
     * @param node 节点（遵循XPath形式 如：/recordList/record）
     * @param cls clazz
     * @return
     * @throws Exception
     */
    public List<T> parseXml2List(String xml, String node, Class<T> clazz) {
        List<T> lists = new ArrayList<T>();
        try {
            Document doc = DocumentHelper.parseText(xml);
            @SuppressWarnings("unchecked")
            List<Element> list = doc.selectNodes(node);

            if (!list.isEmpty()) {
                for (Element outer : list) {
                    T ob = clazz.newInstance();
                    @SuppressWarnings("unchecked")
                    // bean节点 获得具体字段
                    List<Element> li = outer.elements();
                    for (Element inner : li) {
                        String name = inner.getName();
                        String value = inner.getText();
                        Field field = ob.getClass().getDeclaredField(name);
                        field.setAccessible(true);
                        convertValue(field, ob, value);
                    }
                    lists.add(ob);
                }
            }
        }
        catch (Exception e) {
            log.error("parseXml2List error", e);
        }
        return lists;
    }

    /**
     * 反射设置实体不同类型字段的值  </br>
     * <暂时只支持 日期 字符串 boolean Integer BigDecimal值设置  ToBeContinue>
     * @param field
     * @param obj
     * @param value
     * @throws Exception
     */
    private static void convertValue(Field field, Object obj, String value)
        throws Exception {
        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (field.getGenericType().toString().equals("class java.lang.Integer")) {
            field.set(obj, Integer.parseInt(value));
        }
        else if (field.getGenericType().toString().equals("boolean")) {
            field.set(obj, Boolean.parseBoolean(value));
        }
        else if (field.getGenericType().toString().equals("class java.math.BigDecimal")) {
            field.set(obj, new BigDecimal(value));
        }
        else if (field.getGenericType().toString().equals("class java.util.Date")) {
            field.set(obj, sim.parse(value));
        }
        else {
            field.set(obj, value);
        }
    }

}
